package main

import (
	"fmt"
	"math"
)

type CircleStruct struct {
	x float64
	y float64
	r float64
}

// 使用 receiver 来定义 CircleStruct 的 一个方法
func (c *CircleStruct) area() float64 {
	return math.Pi * c.r * c.r
}

// 结构体的参数的传入是一个拷贝，里面的改动不会影响原值。
func circlePlusBad(c CircleStruct) {
	c.x += 1
}

// 使用 receiver 来定义 CircleStruct 的 一个方法
func (c *CircleStruct) circlePlusGood() {
	c.x += 1
}

func main() {
	// init: 结构体可以默认初始化
	var c CircleStruct
	fmt.Println(c)

	// init: 使用 new 返回一个指针
	var c2 *CircleStruct = new(CircleStruct)
	fmt.Println(c2)

	// init: 初始化内部的字段
	c3 := CircleStruct{x: 0, y: 0, r: 5}
	fmt.Println(c3)

	// init: 初始化内部的字段（是用了字段的顺序）
	c4 := CircleStruct{0, 0, 5}
	fmt.Println(c4)

	// 调用结构的方法
	fmt.Println(c4.area())

	// 测试结构的参数传入。
	circlePlusBad(c)
	fmt.Println("Bad, no change:", c)

	// 测试结构的变量赋值
	var c5 = c

	// 测试结构体的参数传入
	c.circlePlusGood()
	fmt.Println("Good, changed:",c)

	// 测试结构的变量赋值
	fmt.Println("Bad, no change:", c5)
}
